home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / thesource-7.lha / Source / Chunky2Planar.lha / Chunky2Planar / c2p_020_FastRam2.s < prev    next >
Text File  |  1994-02-18  |  7KB  |  280 lines

  1. ; Chunky2Planar algorithm. [writes pipelined a little]
  2. ;
  3. ;     Cpu only solution
  4. ;    Optimised for 020+fastram
  5. ;    Aim for less than 90ms for 320x200x256 on 14MHz 020
  6.  
  7.     output    five_pass.o
  8.     opt    l+    ;Linkable code
  9.     opt    c+    ;Case sensitive
  10.     opt    d-    ;No debugging information
  11.     opt    m+    ;Expand macros in listing
  12.     opt    o-    ;No optimisation
  13.     
  14.     xdef    _chunky2planar
  15.         
  16. ;  a0 -> chunky pixels
  17. ;  a1 -> plane0
  18.  
  19. width        equ    320        ; must be multiple of 32
  20. height        equ    200
  21. plsiz        equ    (width/8)*height
  22.  
  23.         _chunky2planar:
  24.         ;a0 = chunky buffer
  25.         ;a1 = first bitplane
  26.         
  27.     movem.l    d2-d7/a2-a6,-(sp)
  28.     move.l    a0,a2
  29.     add.l    #plsiz*8,a2    ;a2 = end of chunky buffer
  30.     
  31.     ;; Sweep thru the whole chunky data once,
  32.     ;; Performing 3 merge operations on it.
  33.     
  34.     move.l    #$00ff00ff,a3    ; load byte merge mask
  35.     move.l    #$0f0f0f0f,a4    ; load nibble merge mask
  36.     
  37. firstsweep
  38.  movem.l (a0),d0-d7      ;8+4n   40      cycles
  39.  move.l  d4,a6           a6 = CD
  40.  move.w  d0,d4           d4 = CB
  41.  swap    d4              d4 = BC
  42.  move.w  d4,d0           d0 = AC
  43.  move.w  a6,d4           d4 = BD
  44.  move.l  d5,a6           a6 = CD
  45.  move.w  d1,d5           d5 = CB
  46.  swap    d5              d5 = BC
  47.  move.w  d5,d1           d1 = AC
  48.  move.w  a6,d5           d5 = BD
  49.  move.l  d6,a6           a6 = CD
  50.  move.w  d2,d6           d6 = CB
  51.  swap    d6              d6 = BC
  52.  move.w  d6,d2           d2 = AC
  53.  move.w  a6,d6           d6 = BD
  54.  move.l  d7,a6           a6 = CD
  55.  move.w  d3,d7           d7 = CB
  56.  swap    d7              d7 = BC
  57.  move.w  d7,d3           d3 = AC
  58.  move.w  a6,d7           d7 = BD
  59.  move.l  d7,a6
  60.  move.l  d6,a5
  61.  move.l  a3,d6   ; d6 = 0x0x
  62.  move.l  a3,d7   ; d7 = 0x0x
  63.  and.l   d0,d6   ; d6 = 0b0r
  64.  and.l   d2,d7   ; d7 = 0j0z
  65.  eor.l   d6,d0   ; d0 = a0q0
  66.  eor.l   d7,d2   ; d2 = i0y0
  67.  lsl.l   #8,d6   ; d6 = b0r0
  68.  lsr.l   #8,d2   ; d2 = 0i0y
  69.  or.l    d2,d0           ; d0 = aiqy
  70.  or.l    d7,d6           ; d2 = bjrz
  71.  move.l  a3,d7   ; d7 = 0x0x
  72.  move.l  a3,d2   ; d2 = 0x0x
  73.  and.l   d1,d7   ; d7 = 0b0r
  74.  and.l   d3,d2   ; d2 = 0j0z
  75.  eor.l   d7,d1   ; d1 = a0q0
  76.  eor.l   d2,d3   ; d3 = i0y0
  77.  lsl.l   #8,d7   ; d7 = b0r0
  78.  lsr.l   #8,d3   ; d3 = 0i0y
  79.  or.l    d3,d1           ; d1 = aiqy
  80.  or.l    d2,d7           ; d3 = bjrz
  81.  
  82.  move.l  a4,d2   ; d2 = 0x0x
  83.  move.l  a4,d3   ; d3 = 0x0x
  84.  and.l   d0,d2   ; d2 = 0b0r
  85.  and.l   d1,d3   ; d3 = 0j0z
  86.  eor.l   d2,d0   ; d0 = a0q0
  87.  eor.l   d3,d1   ; d1 = i0y0
  88.  lsr.l   #4,d1   ; d1 = 0i0y
  89.  or.l    d1,d0           ; d0 = aiqy
  90.  move.l  d0,(a0)+
  91.  lsl.l    #4,d2
  92.  or.l    d3,d2           ; d1 = bjrz
  93.  move.l    d2,(a0)+
  94.  
  95.  move.l  a4,d3   ; d3 = 0x0x
  96.  move.l  a4,d1   ; d1 = 0x0x
  97.  and.l   d6,d3   ; d3 = 0b0r
  98.  and.l   d7,d1   ; d1 = 0j0z
  99.  eor.l   d3,d6   ; d6 = a0q0
  100.  eor.l   d1,d7   ; d7 = i0y0
  101.  lsr.l   #4,d7   ; d7 = 0i0y
  102.  or.l    d7,d6           ; d6 = aiqy
  103.  move.l    d6,(a0)+
  104.  lsl.l    #4,d3
  105.  or.l    d1,d3           ; d7 = bjrz
  106.  move.l    d3,(a0)+
  107.  
  108. ; move.l  d0,(a0)+
  109. ; move.l  d2,(a0)+
  110. ; move.l  d6,(a0)+
  111. ; move.l  d3,(a0)+
  112.  move.l  a6,d7
  113.  move.l  a5,d6
  114.  move.l  a3,d0   ; d0 = 0x0x
  115.  move.l  a3,d1   ; d1 = 0x0x
  116.  and.l   d4,d0   ; d0 = 0b0r
  117.  and.l   d6,d1   ; d1 = 0j0z
  118.  eor.l   d0,d4   ; d4 = a0q0
  119.  eor.l   d1,d6   ; d6 = i0y0
  120.  lsl.l   #8,d0   ; d0 = b0r0
  121.  lsr.l   #8,d6   ; d6 = 0i0y
  122.  or.l    d6,d4           ; d4 = aiqy
  123.  or.l    d1,d0           ; d6 = bjrz
  124.  move.l  a3,d1   ; d1 = 0x0x
  125.  move.l  a3,d6   ; d6 = 0x0x
  126.  and.l   d5,d1   ; d1 = 0b0r
  127.  and.l   d7,d6   ; d6 = 0j0z
  128.  eor.l   d1,d5   ; d5 = a0q0
  129.  eor.l   d6,d7   ; d7 = i0y0
  130.  lsl.l   #8,d1   ; d1 = b0r0
  131.  lsr.l   #8,d7   ; d7 = 0i0y
  132.  or.l    d7,d5           ; d5 = aiqy
  133.  or.l    d6,d1           ; d7 = bjrz
  134.  move.l  a4,d6   ; d6 = 0x0x
  135.  move.l  a4,d7   ; d7 = 0x0x
  136.  and.l   d4,d6   ; d6 = 0b0r
  137.  and.l   d5,d7   ; d7 = 0j0z
  138.  eor.l   d6,d4   ; d4 = a0q0
  139.  eor.l   d7,d5   ; d5 = i0y0
  140.  lsr.l   #4,d5   ; d5 = 0i0y
  141.  or.l    d5,d4           ; d4 = aiqy
  142.  move.l  d4,(a0)+
  143.  lsl.l   #4,d6   ; d6 = b0r0
  144.  or.l    d7,d6           ; d5 = bjrz
  145.  move.l  d6,(a0)+
  146.  
  147.  move.l  a4,d7   ; d7 = 0x0x
  148.  move.l  a4,d5   ; d5 = 0x0x
  149.  and.l   d0,d7   ; d7 = 0b0r
  150.  and.l   d1,d5   ; d5 = 0j0z
  151.  eor.l   d7,d0   ; d0 = a0q0
  152.  eor.l   d5,d1   ; d1 = i0y0
  153.  lsr.l   #4,d1   ; d1 = 0i0y
  154.  or.l    d1,d0           ; d0 = aiqy
  155.  move.l  d0,(a0)+
  156.  lsl.l   #4,d7   ; d7 = b0r0
  157.  or.l    d5,d7           ; d1 = bjrz
  158.  move.l  d7,(a0)+
  159.  cmp.l   a0,a2           ;; 4c
  160.  bne.w   firstsweep      ;; 6c
  161.  
  162.  sub.l   #plsiz*8,a0
  163.  move.l  #$33333333,a5
  164.  move.l  #$55555555,a6
  165.  lea     plsiz*4(a1),a1  ;a2 = plane4
  166.  
  167. secondsweep
  168.  move.l  (a0),d0
  169.  move.l  8(a0),d1
  170.  move.l  16(a0),d2
  171.  move.l  24(a0),d3
  172.  
  173.  move.l  a5,d6   ; d6 = 0x0x
  174.  move.l  a5,d7   ; d7 = 0x0x
  175.  and.l   d0,d6   ; d6 = 0b0r
  176.  and.l   d2,d7   ; d7 = 0j0z
  177.  eor.l   d6,d0   ; d0 = a0q0
  178.  eor.l   d7,d2   ; d2 = i0y0
  179.  lsl.l   #2,d6   ; d6 = b0r0
  180.  lsr.l   #2,d2   ; d2 = 0i0y
  181.  or.l    d2,d0           ; d0 = aiqy
  182.  or.l    d7,d6           ; d2 = bjrz
  183.  move.l  a5,d7   ; d7 = 0x0x
  184.  move.l  a5,d2   ; d2 = 0x0x
  185.  and.l   d1,d7   ; d7 = 0b0r
  186.  and.l   d3,d2   ; d2 = 0j0z
  187.  eor.l   d7,d1   ; d1 = a0q0
  188.  eor.l   d2,d3   ; d3 = i0y0
  189.  lsl.l   #2,d7   ; d7 = b0r0
  190.  lsr.l   #2,d3   ; d3 = 0i0y
  191.  or.l    d3,d1           ; d1 = aiqy
  192.  or.l    d2,d7           ; d3 = bjrz
  193.  move.l  a6,d2   ; d2 = 0x0x
  194.  move.l  a6,d3   ; d3 = 0x0x
  195.  and.l   d0,d2   ; d2 = 0b0r
  196.  and.l   d1,d3   ; d3 = 0j0z
  197.  eor.l   d2,d0   ; d0 = a0q0
  198.  eor.l   d3,d1   ; d1 = i0y0
  199.  lsr.l   #1,d1   ; d1 = 0i0y
  200.  or.l    d1,d0           ; d0 = aiqy
  201.  move.l  d0,plsiz*3(a1)
  202.  add.l   d2,d2
  203.  or.l    d3,d2           ; d1 = bjrz
  204.  move.l  d2,plsiz*2(a1)
  205.  
  206.  move.l  a6,d3   ; d3 = 0x0x
  207.  move.l  a6,d1   ; d1 = 0x0x
  208.  and.l   d6,d3   ; d3 = 0b0r
  209.  and.l   d7,d1   ; d1 = 0j0z
  210.  eor.l   d3,d6   ; d6 = a0q0
  211.  eor.l   d1,d7   ; d7 = i0y0
  212.  lsr.l   #1,d7   ; d7 = 0i0y
  213.  or.l    d7,d6           ; d6 = aiqy
  214.  move.l  d6,plsiz*1(a1)
  215.  add.l   d3,d3
  216.  or.l    d1,d3           ; d7 = bjrz
  217.  move.l  d3,(a1)+
  218.  
  219.  move.l  4(a0),d0
  220.  move.l  12(a0),d1
  221.  move.l  20(a0),d2
  222.  move.l  28(a0),d3
  223.  
  224.  move.l  a5,d6   ; d6 = 0x0x
  225.  move.l  a5,d7   ; d7 = 0x0x
  226.  and.l   d0,d6   ; d6 = 0b0r
  227.  and.l   d2,d7   ; d7 = 0j0z
  228.  eor.l   d6,d0   ; d0 = a0q0
  229.  eor.l   d7,d2   ; d2 = i0y0
  230.  lsl.l   #2,d6   ; d6 = b0r0
  231.  lsr.l   #2,d2   ; d2 = 0i0y
  232.  or.l    d2,d0           ; d0 = aiqy
  233.  or.l    d7,d6           ; d2 = bjrz
  234.  move.l  a5,d7   ; d7 = 0x0x
  235.  move.l  a5,d2   ; d2 = 0x0x
  236.  and.l   d1,d7   ; d7 = 0b0r
  237.  and.l   d3,d2   ; d2 = 0j0z
  238.  eor.l   d7,d1   ; d1 = a0q0
  239.  eor.l   d2,d3   ; d3 = i0y0
  240.  lsl.l   #2,d7   ; d7 = b0r0
  241.  lsr.l   #2,d3   ; d3 = 0i0y
  242.  or.l    d3,d1           ; d1 = aiqy
  243.  or.l    d2,d7           ; d3 = bjrz
  244.  move.l  a6,d2   ; d2 = 0x0x
  245.  move.l  a6,d3   ; d3 = 0x0x
  246.  and.l   d0,d2   ; d2 = 0b0r
  247.  and.l   d1,d3   ; d3 = 0j0z
  248.  eor.l   d2,d0   ; d0 = a0q0
  249.  eor.l   d3,d1   ; d1 = i0y0
  250.  lsr.l   #1,d1   ; d1 = 0i0y
  251.  or.l    d1,d0           ; d0 = aiqy
  252.  move.l  d0,-4-plsiz*1(a1)
  253.  add.l   d2,d2
  254.  or.l    d3,d2           ; d1 = bjrz
  255.  move.l  d2,-4-plsiz*2(a1)
  256.  
  257.  move.l  a6,d3   ; d3 = 0x0x
  258.  move.l  a6,d1   ; d1 = 0x0x
  259.  and.l   d6,d3   ; d3 = 0b0r
  260.  and.l   d7,d1   ; d1 = 0j0z
  261.  eor.l   d3,d6   ; d6 = a0q0
  262.  eor.l   d1,d7   ; d7 = i0y0
  263.  lsr.l   #1,d7   ; d7 = 0i0y
  264.  or.l    d7,d6           ; d6 = aiqy
  265.  move.l  d6,-4-plsiz*3(a1)
  266.  add.l   d3,d3
  267.  or.l    d1,d3           ; d7 = bjrz
  268.  move.l  d3,-4-plsiz*4(a1)
  269.  add.w   #32,a0  ;;4c
  270.  cmp.l   a0,a2   ;;4c
  271.  bne.w   secondsweep     ;;6c
  272.  
  273.     ;300
  274.     
  275. exit    
  276.     movem.l    (sp)+,d2-d7/a2-a6
  277.     rts
  278.     
  279.  
  280.